home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / common / autoformat.c < prev    next >
C/C++ Source or Header  |  2004-02-01  |  6KB  |  255 lines

  1. /*-------------------------------------------------------------
  2.   autoformat.c : assemble time format automatically
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. /* memo: used in exe/main2.c, property/pageformat.c */
  10.  
  11. #include "common.h"
  12.  
  13. /* Globals */
  14.  
  15. void InitAutoFormat(int ilang);
  16. void AutoFormat(char* dst, BOOL* parts);
  17.  
  18. /* Statics */
  19.  
  20. static int  m_idate;              // 0: mm/dd/yy 1: dd/mm/yy 2: yy/mm/dd
  21. static wchar_t m_sMon[11];        // abbreviated name for Monday
  22. static BOOL m_bDayOfWeekIsLast;   // yy/mm/dd ddd
  23. static BOOL m_bTimeMarkerIsFirst; // AM/PM hh:nn:ss
  24.  
  25. /*------------------------------------------------
  26.   initialize locale infomation
  27. --------------------------------------------------*/
  28. void InitAutoFormat(int ilang)
  29. {
  30.     char s[21];
  31.     int codepage;
  32.     int i;
  33.     int aLangDayOfWeekIsLast[] =
  34.         { LANG_JAPANESE, LANG_KOREAN, 0 };
  35.     int aTimeMarkerIsFirst[] = 
  36.         { LANG_CHINESE, LANG_JAPANESE, LANG_KOREAN, 0 };
  37.     
  38.     codepage = GetCodePage(ilang);
  39.     
  40.     MyGetLocaleInfoA(ilang, codepage, LOCALE_IDATE, s, 20);
  41.     m_idate = atoi(s);
  42.     MyGetLocaleInfoW(ilang, codepage, LOCALE_SABBREVDAYNAME1, m_sMon, 10);
  43.     
  44.     m_bDayOfWeekIsLast = FALSE;
  45.     for(i = 0; aLangDayOfWeekIsLast[i]; i++)
  46.     {
  47.         if((ilang & 0x00ff) == aLangDayOfWeekIsLast[i])
  48.         {
  49.             m_bDayOfWeekIsLast = TRUE; break;
  50.         }
  51.     }
  52.     
  53.     m_bTimeMarkerIsFirst = FALSE;
  54.     for(i = 0; aTimeMarkerIsFirst[i]; i++)
  55.     {
  56.         if((ilang & 0x00ff) == aTimeMarkerIsFirst[i])
  57.         {
  58.             m_bTimeMarkerIsFirst = TRUE; break;
  59.         }
  60.     }
  61. }
  62.  
  63. /*------------------------------------------------
  64.   create a format string automatically
  65. --------------------------------------------------*/
  66. void AutoFormat(char* dst, BOOL* parts)
  67. {
  68.     BOOL bdate = FALSE, btime = FALSE;
  69.     BOOL bymd = FALSE, bhms = FALSE;
  70.     BOOL byear = FALSE, bmonth = FALSE, bday = FALSE;
  71.     int i;
  72.     
  73.     for(i = PART_YEAR4; i <= PART_WEEKDAY; i++)
  74.     {
  75.         if(parts[i]) { bdate = TRUE; break; }
  76.     }
  77.     for(i = PART_HOUR; i <= PART_AMPM; i++)
  78.     {
  79.         if(parts[i]) { btime = TRUE; break; }
  80.     }
  81.     for(i = PART_YEAR4; i <= PART_DAY; i++)
  82.     {
  83.         if(parts[i]) { bymd = TRUE; break; }
  84.     }
  85.     for(i = PART_HOUR; i <= PART_SECOND; i++)
  86.     {
  87.         if(parts[i]) { bhms = TRUE; break; }
  88.     }
  89.     
  90.     if(parts[PART_YEAR4] || parts[PART_YEAR])   byear = TRUE;
  91.     if(parts[PART_MONTH] || parts[PART_MONTHS]) bmonth = TRUE;
  92.     if(parts[PART_DAY]) bday = TRUE;
  93.     
  94.     dst[0] = 0;
  95.     
  96.     // day of week
  97.     
  98.     if(!m_bDayOfWeekIsLast && parts[PART_WEEKDAY])
  99.     {
  100.         strcat(dst, "ddd");
  101.         if(bymd)
  102.         {
  103.             if(m_sMon[0] && m_sMon[ wcslen(m_sMon) - 1 ] > 0x7f)
  104.                 strcat(dst, " ");
  105.             else if(m_sMon[0] && m_sMon[ wcslen(m_sMon) - 1 ] == '.')
  106.                 strcat(dst, " ");
  107.             else strcat(dst, ", ");
  108.         }
  109.     }
  110.     
  111.     // year, month, date
  112.     
  113.     if(m_idate == 0) // mm/dd/yy
  114.     {
  115.         if(bmonth) // month
  116.         {
  117.             if(parts[PART_MONTH])  strcat(dst, "mm");
  118.             if(parts[PART_MONTHS]) strcat(dst, "mmm");
  119.             if(bday || byear)
  120.             {
  121.                 if(parts[PART_MONTH]) strcat(dst, "/");
  122.                 else strcat(dst, " ");
  123.             }
  124.         }
  125.         if(bday)  // date
  126.         {
  127.             strcat(dst, "dd");
  128.             if(byear)
  129.             {
  130.                 if(parts[PART_MONTH]) strcat(dst, "/");
  131.                 else strcat(dst, ", ");
  132.             }
  133.         }
  134.         // year
  135.         if(parts[PART_YEAR4]) strcat(dst, "yyyy");
  136.         if(parts[PART_YEAR])  strcat(dst, "yy");
  137.     }
  138.     else if(m_idate == 1) // dd/mm/yy
  139.     {
  140.         if(bday)  // date
  141.         {
  142.             strcat(dst, "dd");
  143.             if(bmonth)
  144.             {
  145.                 if(parts[PART_MONTH]) strcat(dst, "/");
  146.                 else strcat(dst, " ");
  147.             }
  148.             else if(byear) strcat(dst, "/");
  149.         }
  150.         if(bmonth) // month
  151.         {
  152.             if(parts[PART_MONTH])  strcat(dst, "mm");
  153.             if(parts[PART_MONTHS]) strcat(dst, "mmm");
  154.             if(byear)
  155.             {
  156.                 if(parts[PART_MONTH]) strcat(dst, "/");
  157.                 else strcat(dst, " ");
  158.             }
  159.         }
  160.         // year
  161.         if(parts[PART_YEAR4]) strcat(dst, "yyyy");
  162.         if(parts[PART_YEAR])  strcat(dst, "yy");
  163.     }
  164.     else // yy/mm/dd
  165.     {
  166.         if(byear)  // year
  167.         {
  168.             if(parts[PART_YEAR4]) strcat(dst, "yyyy");
  169.             if(parts[PART_YEAR])  strcat(dst, "yy");
  170.             if(bmonth || bday)
  171.             {
  172.                 if(parts[PART_MONTHS]) strcat(dst, " ");
  173.                 else strcat(dst, "/");
  174.             }
  175.         }
  176.         if(bmonth)  // month
  177.         {
  178.             if(parts[PART_MONTH])  strcat(dst, "mm");
  179.             if(parts[PART_MONTHS]) strcat(dst, "mmm");
  180.             if(bday)
  181.             {
  182.                 if(parts[PART_MONTHS]) strcat(dst, " ");
  183.                 else strcat(dst, "/");
  184.             }
  185.         }
  186.         // date
  187.         if(bday) strcat(dst, "dd");
  188.     }
  189.     
  190.     // day of week
  191.     
  192.     if(m_bDayOfWeekIsLast && parts[PART_WEEKDAY])
  193.     {
  194.         if(bymd) strcat(dst, " ");
  195.         strcat(dst, "ddd");
  196.     }
  197.     
  198.     // space or line break between date and time
  199.     
  200.     if(bdate && btime)
  201.     {
  202.         if(parts[PART_BREAK]) strcat(dst, "\\n");
  203.         else
  204.         {
  205.             if(m_idate < 2 && parts[PART_MONTHS] && byear)
  206.                 strcat(dst, " ");
  207.             strcat(dst, " ");
  208.         }
  209.     }
  210.     
  211.     // AM/PM
  212.     
  213.     if(m_bTimeMarkerIsFirst && parts[PART_AMPM])
  214.     {
  215.         strcat(dst, "tt");
  216.         if(bhms) strcat(dst, " ");
  217.     }
  218.     
  219.     // hour
  220.     
  221.     if(parts[PART_HOUR])
  222.     {
  223.         strcat(dst, "hh");
  224.         if(parts[PART_MINUTE] || parts[PART_SECOND])
  225.             strcat(dst, ":");
  226.         else if(!m_bTimeMarkerIsFirst && parts[PART_AMPM])
  227.             strcat(dst, " ");
  228.     }
  229.     
  230.     // minute
  231.     
  232.     if(parts[PART_MINUTE])
  233.     {
  234.         strcat(dst, "nn");
  235.         if(parts[PART_SECOND]) strcat(dst, ":");
  236.         else if(!m_bTimeMarkerIsFirst && parts[PART_AMPM])
  237.             strcat(dst, " ");
  238.     }
  239.     
  240.     // second
  241.     
  242.     if(parts[PART_SECOND])
  243.     {
  244.         strcat(dst, "ss");
  245.         if(!m_bTimeMarkerIsFirst && parts[PART_AMPM])
  246.             strcat(dst, " ");
  247.     }
  248.     
  249.     // AM/PM
  250.     
  251.     if(!m_bTimeMarkerIsFirst && parts[PART_AMPM])
  252.         strcat(dst, "tt");
  253. }
  254.  
  255.